import sensor, image, time, pyb
from pyb import UART

# 初始化摄像头
sensor.reset()  # 传感器复位
sensor.set_pixformat(sensor.RGB565)  # 彩图模式
sensor.set_framesize(sensor.QVGA)  # 设置图像大小QVGA，320x240
sensor.skip_frames(time=2000)  # 跳过帧，稳定系统
sensor.set_auto_gain(False)  # 关闭自动增益
sensor.set_auto_whitebal(False)  # 关闭自动白平衡
clock = time.clock()  # 依据时间戳创建帧率测量对象

# 初始化 UART
uart = UART(3)  # 调用串口3,波特率115200
uart.init(9600, bits=8, parity=None, stop=1)  # 串口端初始化

# 定义数据帧传输函数
def send_byte(cx, cy, w, h):
    output_bytes = bytearray('x=' + str(cx) + ' y=' + str(cy) +
                             ' w=' + str(w) + ' h=' + str(h))  # 数据帧格式 ！！！按需求修改
    uart.write(output_bytes)  # 输出数据帧

# 找出最大的单个色块
def find_max(blobs):
    max_size = 0  # 色块最大尺寸初始化
    max_blob = None  # 色块信息初始化
    for blob in blobs:  # 遍历所有色块
        if blob.pixels() > max_size:  # 若色块像素值超过设定最大值，则赋值给最大值。
            max_blob = blob  # 最大色块信息赋值
            max_size = blob.pixels()  # 色块像素信息赋值给max_size,用作下一次的比较
    return max_blob  # 返回最大色块信息

# 检查并更新发送时间
def should_send(current_time, last_send_time, interval): # 现在时间 上次时间 间隔
    return current_time - last_send_time >= interval # 现在时间 - 上次时间 = 间隔

# 定义颜色阈值
red_threshold = (54, 100, 28, 73, -20, 59)  # 红色色块阈值
green_threshold = (45, 100, -49, -23, 38, 78)  # 绿色色块阈值
yellow_threshold = (63, 100, -6, 80, 19, 70)  # 黄色色块阈值

# 用户可配置的参数
Threshold = green_threshold  # 色块阈值 ！！！按需求修改
Millis = 130  # 数据发送的间隔时间 ！！！按需求修改

last_send_time = pyb.millis()  # 初始化上次发送时间
not_found_sent = False  # 跟踪是否发送了'NF'信息

while True:
    img = sensor.snapshot()  # 打开摄像头
    blobs = img.find_blobs([Threshold])  # 颜色识别

    current_time = pyb.millis()  # 获取当前时间

    if blobs:  # 如果识别到色块
        max_blob = find_max(blobs)  # 最大色块信息赋值
        if max_blob:
            img.draw_rectangle(max_blob.rect())  # 画框

            if should_send(current_time, last_send_time, Millis):  # 检查是否达到发送间隔
                print('x=', max_blob.cx(),
                      'y=', max_blob.cy(),
                      'w=', max_blob.w(),
                      'h=', max_blob.h())  # 终端显示
                send_byte(max_blob.cx(), max_blob.cy(), max_blob.w(), max_blob.h())  # 串口发送数据
                last_send_time = current_time  # 更新上次发送时间
                not_found_sent = False  # 重置'NF'发送标志
    else:  # 如果没识别到色块
        if should_send(current_time, last_send_time, Millis) and not not_found_sent:  # 检查是否达到发送间隔并且未发送'NF'
            uart.write(b'NF')  # 将 'NF' 转为字节形式发送
            print('not found!')
            last_send_time = current_time  # 更新上次发送时间
            not_found_sent = True  # 设置'NF'发送标志
